package com.qf.cachecenter.service;

import org.springframework.data.redis.core.ZSetOperations;

import java.net.InterfaceAddress;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Created by 马英超 on 2022/10/20 19:17
 * @author： 马英超
 * @version：v1.0
 * @description: .__
 * ___________________|__| ____    ____
 * /  ___/\____ \_  __ \  |/    \  / ___\
 * \___ \ |  |_> >  | \/  |   |  \/ /_/  >
 * /____  >|   __/|__|  |__|___|  /\___  /
 * \/ |__|                 \//_____/
 */
public interface CacheService  {

    /**
     * 将数据以String类型保存到redis中,并指定过期时间
     * @param key 键
     * @param obj 任意类型的值，如果传入的是对象，转json再存储
     * @param expireSecond：这个键过期时间
     */
     void set2Redis(String key,Object obj,Integer expireSecond);

    /**
     * 将数据以String类型保存到redis中,永久保存
     * @param key ：键
     * @param obj ：任意类型的值，如果传入的是对象，转json再存储
     */
     void set2Redis(String key,Object obj);

    /**
     * 批量将数据以String类型保存到Redis中，永久保存，存入的形式为k1 v1 k2 v2……
     * @param map
     */
     void mset2Redis(Map map);

    /**
     * 从redis中根据key值获取数据，返回类型是object
     * @param key
     * @return
     */
     Object get2Redis(String key);

    /**
     * 批量根据key从redis中获取数据
     * @param key
     * @return
     */
     Object mget2Redis(String ... key);

    /**
     * 检查redis中是否存在这个键，如果存在则什么都不做，否则就执行更新
     * @param key
     * @param obj
     */
     void setnx2Redis(String key,Object obj);

    /**
     * 将数据从redis中先取出再使用传入值替换原来的值
     * @param key
     * @param obj
     */
     void getset2Redis(String key,Object obj);

    /**
     * 根据key值设置数据多久过期
     * @param key
     * @param seconds
     */
     void setex2Redis(String key,Integer seconds);

    /**
     * 从Redis中先获取数据然后再删除
     * @param key
     * @return
     */
     Object getdel(String key);

    /**
     * 获取指定key的长度
     * @param key
     * @return
     */
     Integer strlen2Redis(String key);

    /**
     * 以步长为1自增
     * @param key
     * @return
     */
     Integer incr2Redis(String key);

    /**
     * 以步长为1自减
     * @param key
     * @return
     */
     Integer decr2Redis(String key);

    /**
     * 以指定步长自增
     * @param key
     * @param stepSize
     * @return
     */
     Integer incrby2Redis(String key,Integer stepSize);

    /**
     * 以指定步长自减
     * @param key
     * @param stepSize
     * @return
     */
     Integer decrby2Redis(String key,Integer stepSize);

    /**
     * 查看指定的key是否过期
     * @param key
     * @return
     */
     Integer ttl2Redis(String key);

    /**
     * 在指定的key的值的末尾追加字符串
     * @param key
     * @param value
     * @return
     */
     Integer append2Redis(String key,String value);


//=========================List类型============================

    /**
     * 以双向链表的形式从左端压入数据
     * @param key
     * @param objects
     */
    void lpush2Redis(String key, Object ... objects);

    /**
     * 以双向链表的形式从右端向redis中压入数据
     * @param key
     * @param objects 压入的数据
     */
    void rpushRedis(String key, Object ... objects);

    /**
     * 获取指定索引范围内的数据
     * @param startIndex 开始索引
     * @param endIndex 结束索引
     * @return
     */
    Object lrange2Redis(Integer startIndex,Integer endIndex);

    /**
     * 从指定key的左端开始取出count个数据
     * @param key 键
     * @param count 取值数据数
     * @return
     */
    Object lpop2Redis(String key,Integer count);

    /**
     * 从指定key的右端开始取出count个数据
     * @param key
     * @param count
     * @return
     */
    Object rpop2Redis(String key,Integer count);

    /**
     * 从originKey源中的右端弹出数据并从左端存入目标targetKey中
     * @param originKey
     * @param targetKey
     * @return
     */
    Integer rpoplpush2Redis(String originKey,String targetKey);

    /**
     * 获取指定key的list类型数据的长度
     * @param key
     * @return
     */
    Integer llen2Redis(String key);

    /**
     * 获取key的list数据中指定索引的元素
     * @param key
     * @param index 索引
     * @return
     */
    Object lindex2Redis(String key,Integer index);

    /**
     * 将指定范围外的数据删除
     * @param key
     * @param startIndex
     * @param endIndex
     */
    void ltrim2Redis(String key,Integer startIndex,Integer endIndex);

    /**
     * 修改指定索引位置的list数据
     * @param key
     * @param index
     * @param changeValue
     */
    void lset2Redis(String key,Integer index,Object changeValue);

    /**
     * 从list集合中删除count个值为delValue的元素
     * @param key list集合
     * @param count 删除元素个数
     * @param delValue 元素
     * @return
     */
    Integer lrem2Redis(String key,Integer count,Object delValue);

//======================hash类型数据===========================

    /**
     * 向Hash集合中添加数据
     * @param key
     * @param field
     * @param value
     */
    void hset2Redis(String key,String field,Object value);
    /**
     * 在集合中批量增加Map类型的数据
     * @param key
     * @param map
     */
    void hmset2Redis(String key,Map map);

    /**
     * 获取指定集中中指定字段的字段值
     * @param key
     * @param field
     * @return
     */
    Object hget2Redis(String key,String field);

    /**
     * 批量获取
     * @param key
     * @param fields
     * @return
     */


    /**
     * 指定步长自增，如果步长为负数则自减
     * @param key
     * @param field
     * @param stepSize
     * @return
     */
    Integer hincrby2Redis(String key,String field,Integer stepSize );

    /**
     * 批量获取指定Hash集合内的字段值
     * @param key
     * @param fields
     * @return
     */
    Object hmget2Redis(String key,String...fields);

    /**
     * 根据key值获取所有字段名和字段值
     * @param key
     * @return
     */
    Object hgetall2Redis(String key);//Map<String,Object> hgetall2Redis(String key);

    /**
     * 判断指定key中是否存在field字段的值，存在则返回1，否则返回0
     * @param key
     * @param field
     * @return
     */
    Integer hexists2Redis(String key,String field);

    /**
     * 根据给定的key查看集合中是否存在field字段，如果存在，则不做操作，否则更新
     * @param key
     * @param field
     * @param changeValue
     */
    void hsetnx2Redis(String key,String field,String changeValue);

    /**
     * 删除集合中的某些字段值
     * @param key
     * @param fields
     * @return
     */
    Integer hdel2Redis(String key,String...fields);

    /**
     * 获取集合的所有key值
     * @param key
     * @return
     */
    String hkeyskey2Redis(String key);

    /**
     *  从集合中获取所有value值
     * @param key
     * @return
     */
    Object kvalsKey2Redis(String key);

    /**
     * 获取指定key的长度
     * @param key
     * @return
     */
    Integer hlen2Redis(String key);

//==================set数据类型===========================

    /**
     * 向set集合中添加数据
     * @param key
     * @param values 数据，
     */
    void sadd2Redis(String key,String...values);

    /**
     * 从集合中取出所有值
     * @param key
     * @return
     */
    Object smembers2Redis(String key);

    /**
     * 在集合中判断是否存在value的值，如果存在则返回1，否则返回-1
     * @param key
     * @param value
     * @return
     */
    Integer sismember2Redis(String key,Object value);

    /**
     * 获取集合长度
     * @param key
     * @return
     */
    Integer scard2Redis(String key);

    /**
     * 删除集合中的指定元素
     * @param key
     * @param delValue
     * @return
     */
    Integer srem2Redis(String key,String delValue);

    /**
     * 从指定集合中获取count个元素，每执行一次获取一次，取出后集合中的数据不存在
     * @param key
     * @param count
     * @return
     */
    Object spop2Redis(String key,Integer count);

    /**
     * 从集合中随机取出一个数据，取出后数据在集合中仍然存在
     * @param key
     * @return
     */
    Object srandmember(String key);

    /**
     * 将 targeValue从sourceKey集合中移到targetKey目标集合内
     * @param sourceKey
     * @param targetKey
     * @param targeValue
     * @return
     */
    Integer smove2Redis(String sourceKey,String targetKey, Object targeValue );

    /**
     * 获取两个集合的交集
     * @param sourceKey
     * @param targetKey
     * @return
     */
    Object sinner2Redis(String sourceKey,String targetKey);

    /**
     * 将两个集合合并
     * @param sourceKey
     * @param targetKey
     * @return
     */
    Object sunion2Redis(String sourceKey,String targetKey);

    /**
     * 取两个集合的交集
     * @param sourceKey
     * @param targetKey
     * @return
     */
    Object sdiff2Redis(String sourceKey,String targetKey);

//==========================zset有序集合=========================

    /**
     * 添加有序set集合
     * @param key
     * @param score
     * @param value
     * @return
     */
  Integer  zadd2Redis(String key,Integer score,String value);

    /**
     * 获取zset集合中的所有数据
     * @param key
     * @param startIndex 起始索引
     * @param endIndex 结束索引
     * @return
     */
  Set<ZSetOperations.TypedTuple<Object>> zrange2Redis(String key, Integer startIndex, Integer endIndex);

    /**
     * 获取zset集合的长度
     * @param key
     * @return
     */
  Integer zcard2Redis(String key);

    /**
     * 查找某个范围内的数据个数
     * @param key
     * @param startScore
     * @param endScore
     * @return
     */
  Integer zcount2Redis(String key,Integer startScore, Integer endScore);

    /**
     * 删除集合中的某个值
     * @param key
     * @param delValue
     * @return
     */
  Integer zrem2Redis(String key,Object delValue);

    /**
     * 将指定范围内的数据按照score从小到大的顺序排列
     * @param key
     * @param start
     * @param stop
     * @return
     */
  Object  zrevrange2Redis(String key,Integer start,Integer stop);



}
